Charger et examiner des DataFrames
Avant de lire une table, définissez les colonnes requises, le sens de leurs valeurs et les entrées à traiter comme manquantes. Ces règles constituent le schéma de la table. Dans l’exemple de commandes ci-dessous, les identifiants sont lus comme des chaînes pour conserver les zéros de "001", tandis que created_at est converti en date. Vérifiez ensuite que le DataFrame obtenu respecte ces règles.
from io import StringIO
import pandas as pd
orders = pd.read_csv(
StringIO("order_id,customer_id,created_at,amount\n"
"001,C1,2026-01-02,120.50\n"
"002,C2,2026-01-03,0\n"),
usecols=["order_id", "customer_id", "created_at", "amount"],
dtype={"order_id": "string", "customer_id": "string"},
parse_dates=["created_at"],
na_values=["", "NA", "null"],
)
Liste de contrôle de l'ingestion
- Identifiez le séparateur, l'encodage, les en-têtes, la convention décimale et les sentinelles d'absence.
- Sélectionnez les colonnes requises et précisez les types sémantiques lorsque l'inférence est risquée.
- Analysez les dates délibérément, puis localisez ou convertissez explicitement les fuseaux horaires.
- Examinez
shape,head,info, les clés dupliquées et les valeurs manquantes. - Vérifiez par assertion les invariants dont dépend l'étape suivante.
assert orders["order_id"].notna().all()
assert orders["order_id"].is_unique
assert orders["amount"].notna().all()
assert orders["amount"].ge(0).all()
Choix de l'index
Conservez l'index de plage par défaut, sauf si une clé métier facilite réellement la sélection ou l'alignement. Une clé peut rester une colonne ordinaire :
orders = orders.set_index("order_id", verify_integrity=True)
orders = orders.reset_index()
N'utilisez pas un champ métier non unique comme index uniquement parce qu'il ressemble à un identifiant.
Renommer à la frontière
Normalisez les noms une seule fois, près de l'ingestion :
orders = orders.rename(columns=str.strip)
orders.columns = orders.columns.str.lower().str.replace(" ", "_", regex=False)
Conservez une correspondance si les noms externes doivent rester traçables.
Limite de volume
Utilisez chunksize lorsque des blocs indépendants peuvent être agrégés progressivement. Si le processus
exige des jointures ou redistributions répétées de la table entière au-delà de la mémoire, changer de moteur
d'exécution vaut généralement mieux qu'une gestion complexe des blocs.
Contrats de lecture
read_csv accepte un chemin ou un objet fichier, comme le StringIO en mémoire ci-dessus. L’exemple renvoie un DataFrame de forme (2, 4) ; orders["order_id"].tolist() vaut ["001", "002"], sans perdre les zéros initiaux. Un chemin relatif part du répertoire de travail du processus. Avec chunksize, le résultat est un itérateur de DataFrames.
na_values complète la liste de marqueurs manquants par défaut. Si "NA" est un identifiant valide, utilisez keep_default_na=False et une liste explicite. parse_dates peut laisser une colonne non convertible sous forme textuelle : vérifiez son type ou imposez pd.to_datetime(..., errors="raise"). La normalisation des noms peut créer des doublons ; vérifiez ensuite orders.columns.is_unique. Les assertions conviennent aux exemples, mais Python peut les désactiver avec -O ; aux frontières contraignantes, levez explicitement des exceptions.